//给定一个字符串 s ，请将 s 分割成一些子串，使每个子串都是 回文串 ，返回 s 所有可能的分割方案。 
//
// 
// 回文串 是正着读和反着读都一样的字符串。 
//
// 
//
// 示例 1： 
//
// 
//输入：s = "google"
//输出：[["g","o","o","g","l","e"],["g","oo","g","l","e"],["goog","l","e"]]
// 
//
// 示例 2： 
//
// 
//输入：s = "aab"
//输出：[["a","a","b"],["aa","b"]]
// 
//
// 示例 3： 
//
// 
//输入：s = "a"
//输出：[["a"]] 
//
// 
//
// 提示： 
//
// 
// 1 <= s.length <= 16 
// s 仅由小写英文字母组成 
// 
//
// 
//
// 
// 注意：本题与主站 131 题相同： https://leetcode-cn.com/problems/palindrome-partitioning/ 
//
// Related Topics 深度优先搜索 广度优先搜索 图 哈希表 👍 34 👎 0

package leetcode.editor.cn;


import java.util.ArrayList;
import java.util.List;



//leetcode submit region begin(Prohibit modification and deletion)
class SolutionOffer2_086 {
    List<List<String>> list = new ArrayList<>();
    List<String> path = new ArrayList<>();
    public String[][] partition(String s) {
        traversal(s, 0);
        String[][] strings = new String[list.size()][];
        for(int i = 0; i < list.size(); i++){
            strings[i] = list.get(i).toArray(new String[list.get(i).size()]);
        }
        return strings;
    }

    public void traversal(String s, int startIndex){
        if(startIndex == s.length()){
            list.add(new ArrayList<>(path));
            return;
        }
        for(int i = startIndex; i < s.length(); i++){
            if(check(s, startIndex, i)){
                path.add(s.substring(startIndex,i+1));
                traversal(s, i+1);
                path.remove(path.size()-1);
            }
        }
    }

    private boolean check(String s, int startIndex, int i) {
        while(startIndex < i){
            if(s.charAt(startIndex) == s.charAt(i)){
                i--;
                startIndex++;
            } else {
                return false;
            }
        }
        return true;
    }
}
//leetcode submit region end(Prohibit modification and deletion)
